package com.buhui.ecommerce.algorithm.QueuePractice;


import lombok.Data;

/**
 * 普通队列的实现
 */
public class NormalQueue <T>{
    int tail;//尾指针，指向队列中最后一个元素的下一个位置
    int front;//头指针
    int count;//队列元素个数
    int queueLength=10;//初始队列容量为10
    T arr[];

    public NormalQueue(){
        arr= (T[]) new Object[queueLength];  //初始长度为10
    }

    public NormalQueue(int customLength){
        this.queueLength=customLength;
        arr= (T[]) new Object[customLength];  //
    }




    //出队
    public T pop(){
        if(empty()){
            System.out.println("当前队列为空，无法出队");
            return null;
        }
        front++;
        count--;
//        System.out.println("出队成功");
        return arr[front-1];
    }

    //入队
    public void push(T element){
        if(full()){
            System.out.println("当前队列已满，无法入队");
            return ;
        }
//        if(empty()){
            arr[tail]=element;
//            tail++;
//            System.out.println("入队成功");
//            return;
//        }
//        arr[tail-1]=element;
        tail++;
        count++;
        System.out.println(element+"入队成功");
    }

    //判空，true为空
    public boolean empty(){
        //普通队列中，尾指针-头指针就是队列中元素的个数
        // 所以尾指针-头指针=0，即头指针=尾指针的时候，队列为空
        if(tail==front){
            return true;
        }
        return false;
    }

    //判队列是否已满,true为满
    public boolean full(){
        if(tail==arr.length){
            return true;
        }
        return false;
    }



    public static void main(String[] args) {
        System.out.println("        --------------------------------测试存储基本类型数据-------------------------------------------------\n");
        NormalQueue<Integer> normalQueue = new NormalQueue<Integer>();
        System.out.println("normalQueue的容量为"+normalQueue.queueLength);
        for (int i = 0; i <10 ; i++) {
            normalQueue.push(i);
        }

        for (int i = 0; i <10 ; i++) {
            System.out.println(normalQueue.pop()+"出队---"+"此时队列剩余元素个数为："+normalQueue.count);
        }


        normalQueue.push(10);
        normalQueue.push(11);
        System.out.println(normalQueue.pop()+"出队---"+"此时队列剩余元素个数为："+normalQueue.count);
        System.out.println(normalQueue.pop()+"出队---"+"此时队列剩余元素个数为："+normalQueue.count);


        System.out.println("--------------------------------测试存储自定义类型数据-------------------------------------------------\n");
        NormalQueue<User> userQueue = new NormalQueue<User>(12);
        System.out.println("userQueue的容量为："+userQueue.queueLength);
        for (int i = 0; i <12 ; i++) {
            userQueue.push(new User(Integer.toString(i),Integer.toString(i)));
        }
        for (int i = 0; i <12 ; i++) {
            System.out.println(userQueue.pop()+"出队---"+"此时队列剩余元素个数为："+userQueue.count);
        }

        userQueue.push(new User("10","10"));
        userQueue.push(new User("11","11"));
        System.out.println(userQueue.pop()+"出队---"+"此时队列剩余元素个数为："+userQueue.count);
        System.out.println(userQueue.pop()+"出队---"+"此时队列剩余元素个数为："+userQueue.count);

    }
}
@Data
class User{
    private String name;
    private String password;
    User(String name ,String password){
        this.name=name;
        this.password=password;

    }
}